package persistencia;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import modelo.Empresa;
import modelo.Endereco;

public class DAOEmpresa{
    
    private Connection conexao;
    
    private void obterConexao(){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conexao = DriverManager.getConnection("jdbc:mysql://localhost/sirp", "root", "123");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    private void liberarConexao(){
        try {
            conexao.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    private void inserirEndereco(Endereco endereco, Empresa empresa) throws SQLException{
        if (endereco != null){
            PreparedStatement pstat = conexao.prepareStatement("INSERT INTO Endereco (rua, numero, complemento, bairro, cidade, estado, pais, cep, empresa_fk) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
            pstat.setString(1, endereco.getRua());
            pstat.setString(2, endereco.getNumero());
            pstat.setString(3, endereco.getComplemento());
            pstat.setString(4, endereco.getBairro());
            pstat.setString(5, endereco.getCidade());
            pstat.setString(6, endereco.getPais());
            pstat.setString(7, endereco.getCEP());
            pstat.setString(8, empresa.getEmail());
            pstat.executeUpdate();
        }
    }
    
    private void alterarEndereco(Endereco endereco, Empresa empresa) throws SQLException{
        if (endereco != null){
            PreparedStatement pstat = conexao.prepareStatement("UPDATE Endereco SET rua = ?, numero = ?, complemento = ?, bairro = ?, cidade = ?, estado = ?, pais = ?, cep = ?, empresa_fk = ? WHERE id = ?");
            pstat.setString(1, endereco.getRua());
            pstat.setString(2, endereco.getNumero());
            pstat.setString(3, endereco.getComplemento());
            pstat.setString(4, endereco.getBairro());
            pstat.setString(5, endereco.getCidade());
            pstat.setString(6, endereco.getPais());
            pstat.setString(7, endereco.getCEP());
            pstat.setString(8, empresa.getEmail());
            pstat.executeUpdate();
        }
    }
        
    public void inserir(Empresa empresa){
        obterConexao();
        try {
            PreparedStatement pstat = conexao.prepareStatement("INSERT INTO Empresa (razaoSocial, nome, cnpj, porte, ramoAtividade, email) VALUES (?, ?, ?, ?, ?, ?)");
            pstat.setString(1, empresa.getRazaoSocial());
            pstat.setString(2, empresa.getNome());
            pstat.setString(3, empresa.getCnpj());
            pstat.setString(4, empresa.getPorte());
            pstat.setString(5, empresa.getRamoAtividade());
            pstat.setString(6, empresa.getEmail());
                       
            pstat.executeUpdate();
            
            if (empresa.getEnderecos() != null){
                Endereco[] e = empresa.getEnderecos();
                for (int i = 0; i < e.length; i++){
                    inserirEndereco(e[i], empresa);
                }
            }
            
                  
                        
        } catch (SQLException e) {
            e.printStackTrace();
        }
        liberarConexao();
    }
    
    public void atualizar(Empresa empresa){
        obterConexao();
        try {
            PreparedStatement stat = conexao.prepareStatement("UPDATE Empresa SET razaoSocial = ?, nome = ?, email = ?, porte = ?, ramoAtividade = ? WHERE cnpj = ? ");
            stat.setString(1, empresa.getRazaoSocial());
            stat.setString(2, empresa.getNome());
            stat.setString(3, empresa.getCnpj());
            stat.setString(4, empresa.getPorte());
            stat.setString(5, empresa.getRamoAtividade());
            stat.setString(6, empresa.getEmail());
                      
            stat.executeUpdate();
            
            if (empresa.getEnderecos()!= null){
                Endereco[] e = empresa.getEnderecos();
                for (int i = 0; i < e.length; i++){
                	if (e[i].getId() != 0){
                		alterarEndereco(e[i], empresa);
                	} else {
                		inserirEndereco(e[i], empresa);
                	}
                }
            }
                                 
        } catch (SQLException e) {
            e.printStackTrace();
        }
        liberarConexao();
    }
    
    public void excluir(Empresa empresa){
        obterConexao();
        try {
            Statement stat = conexao.createStatement();
            stat.executeUpdate("DELETE FROM Empresa WHERE cnpj = '" + empresa.getCnpj() + "' ");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        liberarConexao();
    }
    
    public Empresa buscarEmpresa(String cnpj){
        obterConexao();
        try {
            PreparedStatement stat = conexao.prepareStatement("SELECT * FROM Empresa WHERE cnpj = ?");
            stat.setString(1, cnpj);
            ResultSet set = stat.executeQuery();
            
                  
            if (set.next()){
            	Empresa empresa = new Empresa();
            	empresa.setRazaoSocial(set.getString("razaoSocial"));
            	empresa.setNome(set.getString("nome"));
            	empresa.setCnpj(set.getString("cnpj"));
            	empresa.setPorte(set.getString("porte"));
            	empresa.setRamoAtividade(set.getString("ramoAtividade"));
            	empresa.setEmail(set.getString("email"));
            	
                stat = conexao.prepareStatement("SELECT count(*) FROM Endereco WHERE empresa_fk = ?");
                stat.setString(1, cnpj);
                set = stat.executeQuery();
                
                if (set.next()){
                	int totalEnderecos = set.getInt(1);
                	if (totalEnderecos > 0){
                		stat = conexao.prepareStatement("SELECT id = ?, rua = ?, numero = ?, complemento = ?, bairro = ?, cidade = ?, estado = ?, pais = ?, cep = ?, empresa_fk = ?");
                		stat.setString(1, cnpj);
                		set = stat.executeQuery();
                		Endereco[] enderecos = new Endereco[totalEnderecos];
                		for (int i = 0; i < totalEnderecos; i++){
                			set.next();
                			enderecos[i] = new Endereco();
                			enderecos[i].setId(set.getInt("id"));
                			enderecos[i].setRua(set.getString("rua"));
                			enderecos[i].setNumero(set.getString("numero"));
                			enderecos[i].setComplemento(set.getString("complemento"));
                			enderecos[i].setBairro(set.getString("bairro"));
                			enderecos[i].setCidade(set.getString("cidade"));
                			enderecos[i].setEstado(set.getString("estado"));
                			enderecos[i].setPais(set.getString("pais"));
                			enderecos[i].setCEP(set.getString("cep"));
                			
                		}               		
                		empresa.setEnderecos(enderecos);
                	}
                }
                
                return empresa;
            }
            
            
        } catch (SQLException e) {
            e.printStackTrace();
        }
        liberarConexao();
        return null;
    }
    
           
}